iT邦幫忙

2021 iThome 鐵人賽

DAY 24
0
Software Development

C++ 三十天學習紀錄系列 第 24

【Day 24】Pointer - Practice 1

  • 分享至 

  • xImage
  •  

大家都還記得之前的adjacency list吧!這個練習題結合了adjacency list 與 pointer 的概念,我認為是一個很好的練習,不過又不會太複雜,畢竟 pointer 對我來說還是一個非常似是而非的觀念。

我們今天要製作 adjacency list 的方法是:

  1. 先給定有 n 個 nodes,以此來建立長度為 n 的陣列。
  2. 每一項都會配一個動態陣列,其長度為 n。
  3. 每個動態陣列中都存這個 node 與那些 nodes 相鄰。

如下圖:

Sol
按照以下的程式碼,我們的結果可以符合下方輸入輸出格式:
NODE_CNT_MAX:最多有多少 nodes。
nodeCnt:nodes 總數。
degrees:有多少 nodes 與目前的 node 相鄰。
neighbors:與之相鄰的 nodes。

inputGraphInfo:將輸入進去的資料分別存入陣列中。
printGraph:將每個 node 各自的鄰居輸出。
releaseMemory:由於動態陣列不會自己刪除其記憶體,我們需要寫 delete statments



接下來,我們來運用上面的程式碼來做延伸,
若輸出輸入格式要符合以下:

例如:

不直接印出與其相鄰的 nodes,而是只要相鄰的話就存成 1,若與這個 node 不相鄰就存成 0,並將整個 neighbors 陣列都印出來。

Sol
這邊我只對printGraph這個函數作改變,新增一個二維陣列adjacencyMatrix,其長度為nodeCnt,並將其各項初始化為v0,接下來運用 for 迴圈判斷,只要有相鄰的點就改為 1。

Pseudocode

printGraph:
	// 建adjacencyMatrix,並將其各項皆初始化為0
	for i in range 0 ~ nodeCnt {
		for j in range 0 ~ degrees[i] {
			if (0 <= neighbors[i][j] < nodeCnt) {
				adjacencyMatrix[i][neighbors[i][j]] = 1;
			}
		}
	}
	// 按題目要求輸出
	for i in range 0 ~ nodeCnt {
		for j in range 0 ~ nodeCnt {
			if (j == nodeCnt - 1) {
				cout << adjacencyMatrix[i][j];
			}
			else {
				cout << adjacencyMatrix[i][j] << " ";
			}
		}
		if (i != nodeCnt - 1) {
			cout << "\n";
		}
	}

上一篇
【Day 23】Pointer 指標
下一篇
【Day 25】C String
系列文
C++ 三十天學習紀錄30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言